package com.yh.handler;

import com.yh.utils.Constants;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.springframework.util.ObjectUtils;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 类型映射器，将List字符串类型的数据映射到数据库的varchar类型
 *
 * @author yuhuan
 * @date 2022/01/13
 */
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ListTypeHandler extends BaseTypeHandler<List<String>> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException {
        // 将List<String>类型的元素用","分隔。最终拼接成一个字符串
        String value = String.join(Constants.DELIMITER, parameter);
        ps.setString(i, value);
    }

    @Override
    public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return handler(rs.getString(columnName));
    }

    @Override
    public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return handler(rs.getString(columnIndex));
    }

    @Override
    public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return handler(cs.getString(columnIndex));
    }

    /**
     * 将字符串序列处理成List集合，
     * 踩坑点：因java存在泛型抹除的问题，请不要试图以Object来处理所有类型的数据，这样可能会出现无法序列化的问题
     */
    private List<String> handler(String listString) {
        List<String> list = new ArrayList<>();
        // 如果字符串不存在则直接返回空的集合
        if (ObjectUtils.isEmpty(listString)) {
            return list;
        }
        for (String s : listString.split(Constants.DELIMITER)) {
            list.add(s);
        }
        return list;
    }
}
